Computer programming languages are used to write program code that causes a computer to execute a series of computing instructions in a certain order. A program code can be difficult to read and understand due to a variety of factors, including: the size of the program code, the nested nature of the procedural or functional calls in the program, the idiosyncrasies associated with the syntax and semantics of the associated programming language, the behavior of the corresponding compiler, etc.
Program analysis tools have been developed to help a human operator better understand a program code and to, for example, be able to systematically trace the path of execution in the code. Despite having the advantage of using such analysis tools, many program codes remain difficult to trace. For example, in a program code written in the COBOL programming language, determining the exact flow, between nested calls in paragraphs involving GOTO and PERFORM statements, can be very challenging.
Particularly, due to the manner a COBOL compiler follows the path from one statement in a call to another, when a call returns after the execution of a second call nested in a first call, a human operator tracing such program will have a hard time determining the valid or invalid paths. When a program code is being updated, it is important to know the valid and invalid paths. Otherwise, a piece of code may be modified creating a change in control flow that may cause the program to generate undesirable results.